package pro.uccs.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**********************************************************
 * Copyright © 2017,北京世纪奥通科技有限公司
 * All Rights Reserved.
 * 文件名称： RandomValueStringGenerator.java
 * 摘 要：
 *  [
	 	MD5算法具有以下特点：
	
		1、压缩性：任意长度的数据，算出的MD5值长度都是固定的。 
		2、容易计算：从原数据计算出MD5值很容易。 
		3、抗修改性：对原数据进行任何改动，哪怕只修改1个字节，所得到的MD5值都有很大区别。 
		4、强抗碰撞：已知原数据和其MD5值，想找到一个具有相同MD5值的数据（即伪造数据）是非常困难的。
		
		SHA1算法简介：
	
		安全哈希算法（Secure Hash Algorithm）主要适用于数字签名标准（Digital Signature Standard DSS）里面定义的数字签名算法（Digital Signature Algorithm DSA）。
		对于长度小于2^64位的消息，SHA1会产生一个160位的消息摘要。当接收到消息的时候，这个消息摘要可以用来验证数据的完整性。在传输的过程中，数据很可能会发生变化，那么这时候就会产生不同的消息摘要。
 * 	]
 * 初始版本：1.0.0
 * 原 作 者：liuxuexue
 * 完成日期： 2018年01月11日 下午19:50:16
 * 当前版本： 1.0.0
 * 作 者： liuxuexue
 * 完成日期： 2018年01月11日 下午19:50:16
 *****************************************************************/
public class HashUtil {
	
	/**
     * 计算字符串的hash值
     * @param string    明文
     * @param algorithm 算法名
     * @return          字符串的hash值
	 * @throws NoSuchAlgorithmException 
	 * @throws UnsupportedEncodingException 
     */
    public static String hash(String string, String algorithm) throws NoSuchAlgorithmException, UnsupportedEncodingException {
        if (string.isEmpty()) {
            return "";
        }
        MessageDigest hash = null;
        hash = MessageDigest.getInstance(algorithm);
        byte[] bytes = hash.digest(string.getBytes("UTF-8"));
        String result = "";
        for (byte b : bytes) {
            String temp = Integer.toHexString(b & 0xff);
            if (temp.length() == 1) {
                temp = "0" + temp;
            }
            result += temp;
        }
        return result;
    }

    /**
     * 计算文件的hash值
     * @param file      文件File
     * @param algorithm 算法名
     * @return          文件的hash值
     * @throws NoSuchAlgorithmException 
     * @throws IOException 
     */
    public static String hash(File file, String algorithm) throws NoSuchAlgorithmException, IOException {
        if (file == null || !file.isFile() || !file.exists()) {
            return "";
        }
        FileInputStream in = null;
        String result = "";
        byte buffer[] = new byte[0124];
        int len;
        try {
            MessageDigest hash = MessageDigest.getInstance(algorithm);
            in = new FileInputStream(file);
            while ((len = in.read(buffer)) != -1) {
                hash.update(buffer, 0, len);
            }
            byte[] bytes = hash.digest();

            for (byte b : bytes) {
                String temp = Integer.toHexString(b & 0xff);
                if (temp.length() == 1) {
                    temp = "0" + temp;
                }
                result += temp;
            }
        }finally {
            if(null!=in){
               in.close();
            }
        }
        return result;
    }
    
}
